const crypto = require('crypto');
require('dotenv').config();

// AES加密配置
const ALGORITHM = 'aes-256-cbc';
const SECRET_KEY = process.env.AES_SECRET_KEY || 'hun_action_aes_encryption_key_2024';
const IV_LENGTH = 16; // AES块大小

// 生成密钥（32字节）
function getKey() {
  return crypto.createHash('sha256').update(SECRET_KEY).digest();
}

/**
 * AES加密
 * @param {string} text - 要加密的文本
 * @returns {string} - 加密后的文本（base64格式）
 */
function encrypt(text) {
  if (!text) return '';
  
  try {
    const key = getKey();
    const iv = crypto.randomBytes(IV_LENGTH);
    const cipher = crypto.createCipher(ALGORITHM, key);
    
    let encrypted = cipher.update(text, 'utf8', 'hex');
    encrypted += cipher.final('hex');
    
    // 将IV和加密数据组合，然后转换为base64
    const combined = iv.toString('hex') + ':' + encrypted;
    return Buffer.from(combined).toString('base64');
  } catch (error) {
    console.error('加密失败:', error);
    throw new Error('数据加密失败');
  }
}

/**
 * AES解密
 * @param {string} encryptedData - 加密的数据（base64格式）
 * @returns {string} - 解密后的文本
 */
function decrypt(encryptedData) {
  if (!encryptedData) return '';
  
  try {
    const key = getKey();
    
    // 从base64解码
    const combined = Buffer.from(encryptedData, 'base64').toString();
    const parts = combined.split(':');
    
    if (parts.length !== 2) {
      throw new Error('无效的加密数据格式');
    }
    
    const iv = Buffer.from(parts[0], 'hex');
    const encrypted = parts[1];
    
    const decipher = crypto.createDecipher(ALGORITHM, key);
    let decrypted = decipher.update(encrypted, 'hex', 'utf8');
    decrypted += decipher.final('utf8');
    
    return decrypted;
  } catch (error) {
    console.error('解密失败:', error);
    throw new Error('数据解密失败');
  }
}

/**
 * 生成随机字符串
 * @param {number} length - 字符串长度
 * @returns {string} - 随机字符串
 */
function generateRandomString(length = 32) {
  return crypto.randomBytes(length).toString('hex');
}

/**
 * 生成MD5哈希
 * @param {string} text - 要哈希的文本
 * @returns {string} - MD5哈希值
 */
function md5(text) {
  return crypto.createHash('md5').update(text).digest('hex');
}

/**
 * 生成SHA256哈希
 * @param {string} text - 要哈希的文本
 * @returns {string} - SHA256哈希值
 */
function sha256(text) {
  return crypto.createHash('sha256').update(text).digest('hex');
}

/**
 * 生成UUID
 * @returns {string} - UUID字符串
 */
function generateUUID() {
  return crypto.randomUUID();
}

/**
 * 脱敏手机号
 * @param {string} phone - 手机号
 * @returns {string} - 脱敏后的手机号
 */
function maskPhone(phone) {
  if (!phone || phone.length < 7) return phone;
  return phone.substring(0, 3) + '****' + phone.substring(phone.length - 4);
}

/**
 * 脱敏身份证号
 * @param {string} idCard - 身份证号
 * @returns {string} - 脱敏后的身份证号
 */
function maskIdCard(idCard) {
  if (!idCard || idCard.length < 8) return idCard;
  return idCard.substring(0, 4) + '**********' + idCard.substring(idCard.length - 4);
}

/**
 * 脱敏姓名
 * @param {string} name - 姓名
 * @returns {string} - 脱敏后的姓名
 */
function maskName(name) {
  if (!name || name.length < 2) return name;
  if (name.length === 2) {
    return name.charAt(0) + '*';
  }
  return name.charAt(0) + '*'.repeat(name.length - 2) + name.charAt(name.length - 1);
}

/**
 * 验证数据完整性
 * @param {string} data - 原始数据
 * @param {string} hash - 哈希值
 * @returns {boolean} - 是否完整
 */
function verifyIntegrity(data, hash) {
  return sha256(data) === hash;
}

/**
 * 生成数据签名
 * @param {string} data - 要签名的数据
 * @param {string} secret - 密钥
 * @returns {string} - 签名
 */
function generateSignature(data, secret = SECRET_KEY) {
  const hmac = crypto.createHmac('sha256', secret);
  hmac.update(data);
  return hmac.digest('hex');
}

/**
 * 验证数据签名
 * @param {string} data - 原始数据
 * @param {string} signature - 签名
 * @param {string} secret - 密钥
 * @returns {boolean} - 签名是否有效
 */
function verifySignature(data, signature, secret = SECRET_KEY) {
  const expectedSignature = generateSignature(data, secret);
  return signature === expectedSignature;
}

module.exports = {
  encrypt,
  decrypt,
  generateRandomString,
  md5,
  sha256,
  generateUUID,
  maskPhone,
  maskIdCard,
  maskName,
  verifyIntegrity,
  generateSignature,
  verifySignature
}; 